#将表情列表处理重复后生成矩阵
import csv
import numpy as np
import numpy.matlib

#根据论文中的计算方法，计算每一帧的表情预测值，生成新的矩阵
'''
            & W_p       & W_a       & W_d
        困倦  & -0.12     & -1.16     & -0.60 
        疑惑  & 1.0525    & 1.3625    & -0.41
        中性  & 0         &       0   & 0 
        愉悦  & 2.77      & 1.21      & 1.42 
'''

'''
对于当前的表情概率，可以构建学生在不同维度下课堂状态值E_p、E_a、E_d 
用w_p、w_a、w_d 分别代表PAD模型中对应三个维度的权重
k是四种不同表情的标号，取值范围为[1,2,3,4]
P_k是当前表情的预测率值，avg是以某时刻的表情在三个维度状态值和的平均值作为对学生当前表情的特征值。
0.0054,0.0002,0.3451,0.6493
'''
W_p = np.array([[-0.12],[1.0525],[0.0],[2.77]])
W_a = np.array([[-1.16],[1.3625],[0.0],[1.21]])
W_d = np.array([[-0.60],[1.2100],[0.0],[1.42]])

def get_mean_var_std(arry):
    #求均值
    arry_mean = np.mean(arry)
    #求方差
    arry_var = np.var(arry)
    #求标准差
    arry_std = np.std(arry,ddof=1)
    #输出行向量的各项值
    print("行向量均值：%.6f" % arry_mean)
    print("行向量方差：%.6f" % arry_var)
    print("行向量标准差:%.6f" % arry_std)
    return arry_mean ,arry_var ,arry_std

def get_avg(my_csv_path):
    #除了第一列，其余列都用，因为第一列是标号，row_number是矩阵的行数
    exps_matrix = np.loadtxt(open(my_csv_path,"rb"),delimiter=",",usecols=[1,2,3,4])
    row_number = exps_matrix.shape[0]
    avg_arry = np.zeros((1,row_number))#生成指定1行row_number列数的全0.0矩阵，存储接下来的各个帧表情得分值
    #计算每一行的表情在PAD模型下得分，存储到新的矩阵中
    for i in range(0,row_number):
        E_p = np.dot (exps_matrix[i],W_p)
        E_a = np.dot (exps_matrix[i],W_a)
        E_d = np.dot (exps_matrix[i],W_d)
        avg = (E_p + E_a + E_d)/3.0
        #该操作将之前的每一个avg值存储到每个学生在一节课时间上的得分矩阵中
        avg_arry[0,i] = avg
    np.savetxt(str(my_csv_path)+'._avg_arry.csv',avg_arry, fmt='%.4f', delimiter=",")
    return avg_arry

#计算两个行向量之间的距离
def get_distance(vec_x,vec_y):
    distance = np.linalg.norm(vec_x - vec_y)
    distance2 = np.sqrt(np.sum(np.square(vec_y - vec_x)))
    print("第1个和第2个行向量的距离：",distance)
    print("第2个和第1个行向量的距离：",distance2)
    return distance

if __name__ == "__main__":
    get_mean_var_std(get_avg("unique_detected_probability_s1.csv"))
    print("************************************")
    get_mean_var_std(get_avg("unique_detected_probability_s2.csv"))
    print("************************************")
    get_mean_var_std(get_avg("unique_detected_probability_s3.csv"))
    print("************************************")
    get_distance(get_avg("unique_detected_probability_s1.csv")[0],get_avg("unique_detected_probability_s2.csv")[0])